package lambda06;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * Predicate接口中的默认方法
 *     //相当于多个条件进行&&连接
 *     //可以完成链式编程
 *     //p1.and(p2).test(product)
 *     default Predicate<T> and(Predicate<? super T> other) {
 *         Objects.requireNonNull(other);
 *         return (t) -> this.test(t) && other.test(t);//p1.test(t) && p2.test(t)
 *     }
 *     default Predicate<T> or(Predicate<? super T> other) {
 *         Objects.requireNonNull(other);
 *         return (t) -> test(t) || other.test(t);
 *     }
 *
 *     default Predicate<T> negate() {
 *         return (t) -> !test(t);
 *     }
 */
       /**
        *  需求:
        *    1.新建一个Product类,其中包含商品名称和商品的价格
        *    2.新建一个List集合,存储四个商品
        *    完成以下需求:
        *     a.打印集合中价格<3000的商品信息
        *     b.打印集合中商品名称包含联想并且价格>=3000的商品信息
        *        商品名称要包含联想
        *        商品价格>=3000
        *     c.打印集合中商品名称包含华硕或者价格>7000的商品信息
        *     d.打印集合中商品名称不包含联想的商品信息
        */



public class PredicateDemo02 {
    // a.打印集合中价格<3000的商品信息
    @Test
    public void test01() {
        List<Product> products = Arrays.asList(
                new Product("联想笔记本", 3000),
                new Product("联想手机", 2000),
                new Product("华硕笔记本", 7000),
                new Product("三星冰箱", 10000)
        );
        method01(products, product -> product.getProductPrice() < 3000);
        // product.getProductPrice()<3000 判断商品价格小于3000
    }


    public void method01(List<Product> products, Predicate<Product> p){
        // 1.遍历products集合
        for(Product product : products){
            if(p.test(product)){ // 对当前遍历到的product对象执行p对应的的Lambda表达式{}中内容
                System.out.println(product);
                // Product{productName='联想手机', productPrice=2000.0}
            }
        }

    }


    //b.打印集合中商品名称包含联想并且价格>=3000的商品信息
           //1.商品名称要包含联想
           //2.商品价格>=3000

    @Test
    public void test02(){
        List<Product> products = Arrays.asList(
                new Product("联想笔记本", 3000),
                new Product("联想手机", 2000),
                new Product("华硕笔记本", 7000),
                new Product("三星冰箱", 10000)
        );
        method02(products,
                    product -> product.getProductName().contains("联想"),
                    product -> product.getProductPrice()>=3000);

    }

    public void method02(List<Product> products,Predicate<Product> p1,Predicate<Product> p2){
        // 1.遍历products集合
        for(Product product : products){
            /*if(p1.test(product) && p2.test(product)){
                System.out.println(product);
                // Product{productName='联想笔记本', productPrice=3000.0}
            }*/
            // 链式编程
            if(p1.and(p2).test(product)){
                System.out.println(product);
                // Product{productName='联想笔记本', productPrice=3000.0}
            }
        }
    }

    @Test
      //     c.打印集合中商品名称包含华硕或者价格>7000的商品信息
    public void test03(){
        List<Product> products = Arrays.asList(
                new Product("联想笔记本", 3000),
                new Product("联想手机", 2000),
                new Product("华硕笔记本", 7000),
                new Product("三星冰箱", 10000)
        );
        method03(products,
                product -> product.getProductName().contains("华硕"),
                product -> product.getProductPrice()>7000);
    }

    public void method03(List<Product> products,Predicate<Product> p1,Predicate<Product> p2){
        for (Product product : products){
            if(p1.or(p2).test(product)){
                // //product.getProductName().contains("华硕") || product.getProductPrice()>7000)
                System.out.println(product);
                //Product{productName='华硕笔记本', productPrice=7000.0}
                //Product{productName='三星冰箱', productPrice=10000.0}
            }
        }
    }

      //     d.打印集合中商品名称不包含联想的商品信息
    @Test
    public void test(){
        List<Product> products = Arrays.asList(
                new Product("联想笔记本", 3000),
                new Product("联想手机", 2000),
                new Product("华硕笔记本", 7000),
                new Product("三星冰箱", 10000)
        );
        method04(products,
                product -> product.getProductName().contains("联想"));
    }

    public void method04(List<Product> products,Predicate<Product> p1){
        for (Product product : products){
            if(p1.negate().test(product)){
                //!product.getProductName().contains("联想"))
                System.out.println(product);
                // Product{productName='华硕笔记本', productPrice=7000.0}
                //Product{productName='三星冰箱', productPrice=10000.0}
            }
        }
    }
}
